package com.vic.sb24.aspect;

import com.vic.sb24.annotation.ChargingApi;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 简单使用@Before,@After,@Around
 * @author 罗利华
 * date: 2020/6/19 10:35
 */
@Slf4j
@Aspect
@Component
public class Aop1 {

    /**
     * 打印结果：
     * Aop1 around before...
     * Aop1 before...
     * Aop1Controller 执行结果...test1
     * Aop1 around after...
     * Aop1 after...
     */

    private final String POINT_CUT = "execution(* com.vic.*.controller..*.*(..))";

    /**
     * 第1个*表示：返回值为所有类型
     * 第2个*表示：任一包，注意：这里的*表示明确一下包名，如sb24
     * ..表示：当前包及其子包
     * 第3个*表示：所有类
     * 第4个*表示：所有方法
     */
//    private final String POINT_CUT = "execution(* com.vic.*.controller..*.*(..))";

    /**
     * 公用point cut
     */
    @Pointcut(POINT_CUT)
    public void pointCut() {
    }

//    @Before("pointCut()")
//    public void before() {
//        System.out.println("Aop1 before...");
//    }

//    @After("pointCut()")
//    public void after(){
//        System.out.println("Aop1 after...");
//    }

    @Around("pointCut() && @annotation(chargingApi)")
    public Object around(ProceedingJoinPoint joinPoint, ChargingApi chargingApi) throws Throwable {
        System.out.println("Aop1 around before..." + chargingApi);
        // 执行完成目标方法
        try {
            Object result = joinPoint.proceed();
            System.out.println("Aop1 around after...");
            return result;
        } catch (Exception e) {
            log.error("异常：", e);
            return "error";
        }

    }

}
